package cn.wolfcode.rbac.web.interceptor;

import cn.wolfcode.rbac.domain.Employee;
import cn.wolfcode.rbac.util.PermissionUtil;
import cn.wolfcode.rbac.util.RequiredPermission;
import cn.wolfcode.rbac.util.UserContext;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class PermissionInterceptor implements HandlerInterceptor {

    // 前置拦截
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 获取当前用户
        // 从 session 中获取登录用户
        // Employee employee = (Employee)request.getSession().getAttribute("EMPLOYEE_IN_SESSION");
        Employee employee = UserContext.getCurrentUser();

        // 1、判断是不是超管
        // isAdmin()  只有是boolean（基本数据类型）才是 is  包装类还是 getAdmin() ； setAdmin（）是一样的
        if(employee.isAdmin()){
            return true;  // 放行
        }

        // 获取当前执行的方法（ Object handler 处理方法），handler强转为 真实类型(HandlerMethod)
        // System.out.println(handler);
        HandlerMethod method = (HandlerMethod)handler;
        // 2、需要判断该方法是否有贴@RequiredPermission注解
        RequiredPermission annotation = method.getMethodAnnotation(RequiredPermission.class);
        // 3、如果有,则需要进行权限验证(判断当前用户是否有该权限,如果有就放行,如果没有就拒绝访问)
       if(annotation == null){  // 没有贴注解（不需要验证），直接放行
           return true;
       }

       // 有贴注解
       // 获取当前登录用户的权限
       // List<String> permissions = (List<String> )request.getSession().getAttribute("PERMISSIONS_IN_SESSION");
        //List<String> permissions = UserContext.getCurrentPermissions();
                // 权限验证（拼接方式）
       /* String simpleName = (method.getBean().getClass()).getSimpleName().replace("Controller","");
        String expression = StringUtils.uncapitalize(simpleName) + ":" + method.getMethod().getName();
        */
        String expression = PermissionUtil.handlerExpression(method.getMethod());
     /*   if(permissions.contains(expression)){
            return true; // 放行
        }*/

        // 跳转页面（请求转发）
        request.getRequestDispatcher("/WEB-INF/views/common/nopermission.ftl").forward(request,response);
       return false;
    }

}
